package org.lazy.util;

import java.math.BigDecimal;
import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;
import java.util.GregorianCalendar;

/**
 * @ClassName: DateUtil
 * @Description: 日期工具类
 * @author Anan
 * @date 2013年7月18日 上午12:47:51
 * 
 */
public class DateUtil {
	private DateUtil(){};
	/**
	 * 计算两个日期之间相差的天数
	 * 
	 * @param smdate
	 *            较小的时间
	 * @param bdate
	 *            较大的时间
	 * @return 相差天数
	 * @throws ParseException
	 * @throws Exception
	 */
	public static int daysBetween(Date smdate, Date bdate) {
		SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
		try {
			smdate = sdf.parse(sdf.format(smdate));
			bdate = sdf.parse(sdf.format(bdate));
		} catch (java.text.ParseException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		Calendar cal = Calendar.getInstance();
		cal.setTime(smdate);
		long time1 = cal.getTimeInMillis();
		cal.setTime(bdate);
		long time2 = cal.getTimeInMillis();
	
		long between_days = (time2 - time1) / (1000 * 3600 * 24);

		return new BigDecimal(String.valueOf(between_days)).abs().intValue();
	}

	/**
	 * 
	 * @description 将时间字符串转化为Date
	 * @author Anan
	 * @time 2013年7月26日 下午7:50:32
	 * @param time
	 *            时间字符串
	 * @param formatStr
	 *            时间格式 如"2013-7-26 19:52:47"、"2013-7-26"
	 * @return
	 */
	public static Date toDate(String time, String formatStr) {
		Date date = null;
		DateFormat dateFormat = new SimpleDateFormat(formatStr);
		try {
			date = dateFormat.parse(time);
		} catch (java.text.ParseException e) {
			e.printStackTrace();
		}
		return date;
	}

	/**
	 * 
	 * @description 将日期转化为字符串
	 * @author Anan
	 * @time 2013年7月30日 下午4:32:30
	 * @param date
	 * @param formatStr
	 * @return
	 */
	public static String toString(Date date, String formatStr) {
		SimpleDateFormat sdf = new SimpleDateFormat(formatStr);
		return sdf.format(date);
	}
	/**
	 * 
	 * @description 将年月日转化为日期
	 * @author Anan
	 * @time  2013年7月30日 下午5:00:33
	 * @param year
	 * @param month
	 * @param day
	 * @return
	 */
	public static Date toDate(int year,int month,int day){
		Date date = null;
		Calendar calender = Calendar.getInstance();
		calender.set(Calendar.YEAR, year);
		calender.set(Calendar.MONTH, month - 1);
		calender.set(Calendar.DATE, day);
		date = calender.getTime();
		return date;
	}
	/**
	 * 
	 * @description 结束日期属于开始日期后的第几个月的日期
	 * @author Anan
	 * @time  2013年8月27日 下午10:00:33
	 * @param startDate 开始日期
	 * @param endDate   结束日期
	 * @return
	 */
	public static int monthsFromStartDate(Date startDate, Date endDate)	{
		int result = 0;
		Date temp = null;
		startDate = toDate(toString(startDate, "yyyy-MM-dd"), "yyyy-MM-dd");
		endDate = toDate(toString(endDate, "yyyy-MM-dd"), "yyyy-MM-dd");
		//开始日期 大于 结束日期 两个日期互换  例如： startDate 2013-05-21 endDate = 2013-04-20
		if(startDate.after(endDate)){
			temp = startDate;
			startDate = endDate;
			endDate = temp;
		}
		Date tempEndDate1 = null;
		Date tempEndDate2 = null;
		int a = getDayOfMonth(startDate);
		int b = getDayOfMonth(endDate);
		int c = a-b;
		Calendar c1 = Calendar.getInstance();
		Calendar c2 = Calendar.getInstance();
		c1.setTime(startDate);
		c2.setTime(endDate);
		c2.set(Calendar.DAY_OF_MONTH, a);
		tempEndDate2 = c2.getTime();
		int i = 0;
		while(true){
			tempEndDate1 = addToMonth(startDate, i);
			if(tempEndDate1.compareTo(tempEndDate2)==0){
				result = i;
				break;
			}
			i++;
			if(i==999999999){//防止死循环
				break;
			}
		}
		if(c<0){
			result = result+1; 
		}
		return result;
	}
	/**
	 * 获取开始时间与结束时间之间间隔的月数
	 * 
	 * @author Anan
	 * @param startDate
	 * @param endDate
	 * @return
	 */
	public static int monthsBetween(Date startDate, Date endDate) {
		int iMonth = 0;
		try {
			Calendar objCalendarDateStart = Calendar.getInstance();
			objCalendarDateStart.setTime(startDate);
			Calendar objCalendarDateEnd = Calendar.getInstance();
			objCalendarDateEnd.setTime(endDate);
			if (objCalendarDateEnd.equals(objCalendarDateStart)
					|| objCalendarDateStart.after(objCalendarDateEnd)) {
				return 0;
			} else {
				if (objCalendarDateEnd.get(Calendar.YEAR) > objCalendarDateStart
						.get(Calendar.YEAR)) {
					iMonth = (objCalendarDateEnd.get(Calendar.YEAR) - objCalendarDateStart
							.get(Calendar.YEAR))
							* 12
							+ objCalendarDateEnd.get(Calendar.MONTH)
							- objCalendarDateStart.get(Calendar.MONTH);
				} else {
					iMonth = objCalendarDateEnd.get(Calendar.MONTH)
							- objCalendarDateStart.get(Calendar.MONTH);
				}
			}

		} catch (Exception e) {
			e.printStackTrace();
		}
		return iMonth;
	}

	/**
	 * 获取输入日期所在月份的第一天
	 * 
	 * @author Anan
	 * @param date
	 * @return
	 */
	public static Date getFristDateForCurrentMonth(Date date) {
		Calendar cal = Calendar.getInstance();
		cal.setTime(date);
		cal.set(GregorianCalendar.DAY_OF_MONTH, 1);

		return cal.getTime();
	}

	/**
	 * 获取输入日期所在月份的最后一天
	 * 
	 * @author Anan
	 * @param date
	 * @return
	 */
	public static Date getLastDateForCurrentMonth(Date date) {
		Calendar cal = Calendar.getInstance();
		cal.setTime(date);

		cal.set(Calendar.DATE, 1);
		cal.roll(Calendar.DATE, -1);

		return cal.getTime();
	}

	/**
	 * 
	 * @description 获取某年某月的第一天
	 * @author Anan
	 * @time 2013年7月30日 下午4:27:53
	 * @param year
	 *            某年
	 * @param month
	 *            某月
	 * @return
	 */
	public static Date getMonthBegin(int year, int month) {
		Date _month_begin = null;
		Calendar calender = Calendar.getInstance();
		calender.set(Calendar.YEAR, year);
		calender.set(Calendar.MONTH, month - 1);
		calender.set(Calendar.DATE, 1);// 把日期设置为当月第一天
		calender.set(Calendar.HOUR_OF_DAY, 0);
		calender.set(Calendar.MINUTE, 0);
		calender.set(Calendar.SECOND, 0);		
		_month_begin = calender.getTime();
		return _month_begin;
	}

	/**
	 * 
	 * @description 获取某年某月的最后一天
	 * @author Anan
	 * @time 2013年7月30日 下午4:28:59
	 * @param year
	 *            某年
	 * @param month
	 *            某月
	 * @return
	 */
	public static Date getMonthEnd(int year, int month) {
		Date month_end = null;
		Calendar calender = Calendar.getInstance();
		calender.set(Calendar.YEAR, year);
		calender.set(Calendar.MONTH, month - 1);
		calender.set(Calendar.DATE, 1);// 把日期设置为当月第一天
		calender.roll(Calendar.DATE, -1);// 日期回滚一天，也就是最后一天
		calender.set(Calendar.HOUR_OF_DAY, 0);
		calender.set(Calendar.MINUTE, 0);
		calender.set(Calendar.SECOND, 0);
		month_end = calender.getTime();
		return month_end;
	}

	/**
	 * 
	 * @description 得到指定月的天数
	 * @author Anan
	 * @time 2013年7月30日 下午4:48:00
	 * @param year
	 *            某年
	 * @param month
	 *            某月
	 * @return
	 */
	public static int getMonthLastDay(int year, int month) {
		Calendar calender = Calendar.getInstance();
		calender.set(Calendar.YEAR, year);
		calender.set(Calendar.MONTH, month - 1);
		calender.set(Calendar.DATE, 1);// 把日期设置为当月第一天
		calender.roll(Calendar.DATE, -1);// 日期回滚一天，也就是最后一天
		int maxDate = calender.get(Calendar.DATE);
		return maxDate;
	}
	/**
	 * 
	 * @description 得到当前日期月的天数
	 * @author Anan
	 * @time  2013年9月1日 下午1:01:44
	 * @param date 
	 * @return
	 */
	public static int getMonthLastDay(Date date) {
		Calendar calender = Calendar.getInstance();
		calender.setTime(date);
		calender.set(Calendar.DATE, 1);// 把日期设置为当月第一天
		calender.roll(Calendar.DATE, -1);// 日期回滚一天，也就是最后一天
		int maxDate = calender.get(Calendar.DATE);
		return maxDate;
	}
	/**
	 * 
	 * @description 当月的第几天
	 * @author Anan
	 * @time  2013年8月22日 下午9:24:30
	 * @param date
	 * @return
	 */
	public static int getDayOfMonth(Date date){
		Calendar cal = Calendar.getInstance();
		cal.setTime(date);
		return cal.get(Calendar.DAY_OF_MONTH);
	}
	/**
	 * 
	 * @description 获得当前日期 + N个月 之后的日期
	 * @author Anan
	 * @time  2013年8月23日 上午12:26:53
	 * @param oldDate
	 * @param n
	 * @return
	 */
	public static Date addToMonth(Date oldDate,int n){
		Date newDate = null;
		Calendar calOld = Calendar.getInstance();
		calOld.setTime(oldDate);
		int month = calOld.get(Calendar.MONTH);
		Calendar calNew = Calendar.getInstance();
		calNew.setTime(oldDate);
		calNew.set(Calendar.MONTH,n+month);
		newDate = calNew.getTime();
		return newDate;
	}
	/**
	 * 
	 * @description 获得当前日期 减去 N月 之后的日期
	 * @author Anan
	 * @time  2013年9月1日 上午12:26:53
	 * @param oldDate
	 * @param n
	 * @return
	 */
	public static Date removeMonths(Date oldDate,int n){
		Date newDate = null;
		Calendar calOld = Calendar.getInstance();
		calOld.setTime(oldDate);
		int month = calOld.get(Calendar.MONTH);
		Calendar calNew = Calendar.getInstance();
		calNew.setTime(oldDate);
		calNew.set(Calendar.MONTH,month-n);
		newDate = calNew.getTime();
		return newDate;
	}
	/**
	 * 
	 * @description 获得当前日期 减去 N天 之后的日期
	 * @author Anan
	 * @time  2013年8月23日 上午12:26:53
	 * @param oldDate
	 * @param n
	 * @return
	 */
	public static Date removeDays(Date oldDate,int n){
		Date newDate = null;
		Calendar calOld = Calendar.getInstance();
		calOld.setTime(oldDate);
		int day = calOld.get(Calendar.DAY_OF_YEAR);
		Calendar calNew = Calendar.getInstance();
		calNew.setTime(oldDate);
		calNew.set(Calendar.DAY_OF_YEAR,day-n);
		newDate = calNew.getTime();
		return newDate;
	}
	
	/**
	 * 
	 * @description 获得当前日期 加上 N天 之后的日期
	 * @author Anan
	 * @time  2013年8月23日 上午12:26:53
	 * @param oldDate
	 * @param n
	 * @return
	 */
	public static Date addDays(Date oldDate,int n){
		Date newDate = null;
		Calendar calOld = Calendar.getInstance();
		calOld.setTime(oldDate);
		int day = calOld.get(Calendar.DAY_OF_YEAR);
		Calendar calNew = Calendar.getInstance();
		calNew.setTime(oldDate);
		calNew.set(Calendar.DAY_OF_YEAR,day+n);
		newDate = calNew.getTime();
		return newDate;
	}
	/**
	 * 
	 * @description 获取两个年份之间的差值
	 * @author Anan
	 * @time  2013年8月23日 上午2:28:29
	 * @param startDate
	 * @param endDate
	 * @return
	 */
	public static int yearsBetween(Date startDate, Date endDate){
		int iYears = 0;
		Calendar calS = Calendar.getInstance();
		calS.setTime(startDate);
		Calendar calE = Calendar.getInstance();
		calE.setTime(endDate);
		int i = startDate.compareTo(endDate);
		if(i==1){
			iYears = calS.get(Calendar.YEAR)-calE.get(Calendar.YEAR);
		}else if(i==-1){
			iYears = calE.get(Calendar.YEAR)-calS.get(Calendar.YEAR);
		}
		return iYears;
	}
//	public static void main(String[] args) {
//		Date now = toDate("2013-1-12", "yyyy-MM-dd");
//		System.out.println(DateUtil.toString(DateUtil.addDays(now, 2),"yyyy-MM-dd"));
//	}
}
